#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class B
{
public:
	B(int b)
	{
		_b = b;
	}
private:
	int _b;
};
class A
{
public:
	A(int a, int ref)//初始化列表：最好跟成员变量位置顺序一致
		:_b(a)
		,ref(ref)
		,_i(a)
	{

	}
	static void fun1()//static：全局函数，调用不了this指针
	{
		//fun2();
		//调不了fun2
		//没有this指针，所以找不到类中的成员函数
	}
	void fun2()
	{
		fun1();
	}
private:
	//有3类成员变量，必须再初始化列表初始化
	//每个成员变量，再初始化列表中只初始化一次

	B _b;//1、没有默认构造函数    //这三个成员变量谁先写，先调用谁的初始化
	int& ref;//2、引用
	const int _i;//3、const;

};

class Date
{
public:
	explicit Date(int year = 0)
	{
		_year = year;
	}
private:
//定义时给缺省值
	int _year = 0;
    int _month = 1;
    int _day = 1;
    B _b = 20;//隐式类型转化
    int* _a = (int*)mallco(sizeof(int)*4);
    static int _i;//这个还是要在类外面声明
};
int main()
{
	Date d1(2025);//构造函数
	Date d2 = 2025;//隐式类型转换：编译器把2025构造一个无名对象，最后用无名对象对d2进行赋值
	//其实就是会有一个临时变量
	//如果不希望有隐式类型的方法，可以在构造函数前面加explicit修饰
	Date d3;
	d3 = 2025;//赋值

	return 0;
}
//const A* this       修饰的是类中的成员
//A const* this       修饰的是类中的成员
//const* const this   修饰的是指针本身


const int* p1 = &p；//p1可变，*p1不可变，此时不能用*p1来修改，但是p1可以转向
int* const p2 = &p；//p2不可变，*p2可变，此时允许*p2来修改其值，但是p2不能转向。
const int* const p3 = &me；//p3不可变，*p3也不可变，此时既不能用*p3来修改其值，也不能转向



